## 9.6. Perl Mailers

There are other programs you can use for sending mail, but they are not as common. Some of these, such as `blat`, provide simple mailers for Windows systems. Instead of looking at these, we'll look at a Perl solution that works across all operating systems.

Mail::Mailer is a popular Perl module for sending Internet email. It provides a simple interface for sending messages with `sendmail` and `mail` (or `mailx`). It also allows you to send messages via SMTP without an external application, which makes it possible to send messages on non-Unix systems like Windows and even the MacOS.

You can use Mail::Mailer this way:

>     my $mailer = new Mail::Mailer ( "smtp" );
>     $mailer->open( {
>         To       => $email,
>         From     => 'The Webmaster <webmaster@scripted.com>',
>         Subject  => 'Web Site Feedback'
>     } );

>     print $mailer <<END_OF_MESSAGE;
>     Your message has been sent and someone should be responding to you
>     shortly. Thanks for taking the time to provide us with your feedback!
>     END_OF_MESSAGE

>     close $mailer;

When you create a Mail::Mailer object, you can specify whether you want it to send the message one of three ways:

mail

  Mail::Mailer will search your system for `mailx`, `Mail`, or `mail` in that order and use the first one it finds (we didn't discuss `Mail`, although on many systems `Mail` and `mail` are the same -- `mail` is simply a symlink to `Mail` ).

sendmail

  Mail::Mailer will use `sendmail` to send mail.

smtp

  Mail::Mailer will use the Net::SMTP Perl module to send mail.

If you do not specify an argument when you create an object, Mail::Mailer will search through each of these three options in order and use the first one it finds When Mail::Mailer uses an external mailer, it uses the `fork` and `exec` technique to avoid passing arguments through the shell.

Mail::Mailer is primarily useful when you use it to send mail via SMTP on systems without `sendmail`. Even though it allows you to use `sendmail` as its mailer, there is no way for you to specify command-line options the way you can if you use `sendmail` directly. Mail::Mailer only uses the -t option when it calls `sendmail`.

To send mail directly through SMTP with Mail::Mailer, you need to have the Net::SMTP module, which is part of the libnet bundle available on CPAN. When you install this module, it should ask you for the SMTP server you use on your network. If this was not configured when the module was installed, you have two options. You can edit the installed Net/Config.pm file in your Perl libraries folder and add your SMTP server to the `smtp_hosts` element of the `NetConfig` hash at the bottom of the file, or you can specify it when you create a Mail::Mailer object. You can do so like this:

>     my $mailer = new Mail::Mailer ( "smtp", Server => $server );

In this example, `$server` would contain the name of your SMTP server. Your network administrator or internet service provider should be able to provide you with the name of this machine.

Copyright © 2001 O'Reilly & Associates. All rights reserved.